package com.helin.helinhealth.utils;

import com.helin.helinhealth.entity.User;
import com.helin.helinhealth.service.AuthService;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import jakarta.servlet.http.HttpServletRequest;

/**
 * 用户上下文工具类
 * 
 * <p>
 * 该工具类用于管理和获取当前登录用户的信息，如用户ID、角色等。
 * 从HTTP请求头中获取JWT令牌，并解析出用户信息。
 * </p>
 * 
 * <p>
 * 该类是整个应用的用户身份中心，所有涉及当前用户身份的操作都应通过此类获取信息，
 * 以保证用户身份判断的一致性。
 * </p>
 */
public class UserContext {
    
    /**
     * 用户角色常量：老人角色（1）
     * 对应数据库中user表的role字段
     */
    public static final int ROLE_ELDERLY = 1;  // 老人角色
    
    /**
     * 用户角色常量：子女角色（2）
     * 对应数据库中user表的role字段
     */
    public static final int ROLE_CHILDREN = 2; // 子女角色
    
    /**
     * 从Spring应用上下文中获取AuthService实例
     * 
     * @return AuthService实例
     */
    private static AuthService getAuthService() {
        return SpringContextUtils.getBean(AuthService.class);
    }
    
    /**
     * 从请求头中获取JWT令牌
     * 
     * @return JWT令牌
     */
    private static String getToken() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes == null) {
            return null;
        }
        
        HttpServletRequest request = attributes.getRequest();
        String headerName = SpringContextUtils.getEnvironment().getProperty("jwt.header-name", "Authorization");
        String tokenPrefix = SpringContextUtils.getEnvironment().getProperty("jwt.token-prefix", "Bearer ");
        
        String header = request.getHeader(headerName);
        if (header == null || !header.startsWith(tokenPrefix)) {
            // 开发阶段，如果没有找到有效的令牌，返回默认openid
            if (isDevMode()) {
                return "dev_token";
            }
            return null;
        }
        
        // 去掉令牌前缀
        return header.substring(tokenPrefix.length());
    }
    
    /**
     * 判断是否为开发模式
     * 
     * @return 是否为开发模式
     */
    public static boolean isDevMode() {
        String profiles = SpringContextUtils.getEnvironment().getProperty("spring.profiles.active", "");
        return profiles.contains("dev");
    }
    
    /**
     * 获取当前登录用户的OpenID
     * 
     * @return 用户OpenID字符串
     */
    public static String getCurrentUserOpenid() {
        if (isDevMode()) {
            return "elderly_001"; // 开发阶段返回固定值
        }
        
        String token = getToken();
        if (token == null) {
            return null;
        }
        
        try {
            return getAuthService().getOpenidFromToken(token);
        } catch (Exception e) {
            return null;
        }
    }
    
    /**
     * 获取当前登录用户ID
     * 
     * @return 用户ID（Long类型）
     */
    public static Long getCurrentUserId() {
        String openid = getCurrentUserOpenid();
        if (openid == null) {
            return null;
        }
        
        User user = getAuthService().getUserByOpenid(openid);
        if (user == null) {
            return null;
        }
        
        return user.getId();
    }
    
    /**
     * 获取当前登录用户的角色
     * 
     * @return 用户角色代码（1-老人，2-子女）
     */
    public static Integer getCurrentUserRole() {
        if (isDevMode()) {
            return ROLE_ELDERLY; // 开发阶段默认返回老人角色
        }
        
        String openid = getCurrentUserOpenid();
        if (openid == null) {
            return null;
        }
        
        User user = getAuthService().getUserByOpenid(openid);
        if (user == null) {
            return null;
        }
        
        return user.getRole();
    }
    
    /**
     * 检查用户是否已登录
     * 
     * @return 是否已登录的布尔值
     */
    public static boolean isUserLoggedIn() {
        if (isDevMode()) {
            return true; // 开发阶段默认返回true
        }
        
        String token = getToken();
        if (token == null) {
            return false;
        }
        
        return getAuthService().validateToken(token);
    }
    
    /**
     * 判断当前用户是否是老人角色
     * 
     * @return 是否是老人角色的布尔值
     */
    public static boolean isElderly() {
        Integer role = getCurrentUserRole();
        return role != null && role == ROLE_ELDERLY;
    }
    
    /**
     * 判断当前用户是否是子女角色
     * 
     * @return 是否是子女角色的布尔值
     */
    public static boolean isChildren() {
        Integer role = getCurrentUserRole();
        return role != null && role == ROLE_CHILDREN;
    }
} 